package utils;

import burp.api.montoya.http.message.responses.HttpResponse;
import ui.ColorTableCellRenderer;
import ui.RulePanel;

import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.List;
import java.util.Objects;

public class PermissionTestUtil {

    /**
     * 判断测试结果的枚举类型
     */
    public enum TestResult {
        DEFENDED("可防御", new Color(0, 255, 0)),
        BYPASSED("被绕过", new Color(255, 0, 0)),
        POTENTIALLY_BYPASSED("待确认", new Color(255, 255, 0));

        private final String text;
        private final Color color;

        TestResult(String text, Color color) {
            this.text = text;
            this.color = color;
        }

        public String getText() {
            return text;
        }

        public Color getColor() {
            return color;
        }
    }

    /**
     * 判断权限测试结果
     *
     * @param originalResponse 原始响应
     * @param testResponse 测试响应（低权限或未授权）
     * @return 测试结果枚举
     */
    public static TestResult evaluateTestResult(HttpResponse originalResponse, HttpResponse testResponse) {
        if (originalResponse == null || testResponse == null) {
            // 如果任一响应为空，无法判断，返回默认结果
            return TestResult.POTENTIALLY_BYPASSED;
        }

        // 获取响应状态码
        int originalStatusCode = originalResponse.statusCode();
        int testStatusCode = testResponse.statusCode();

        // 如果测试请求与原始请求的响应码不一致，则显示"可防御"
        if (originalStatusCode != testStatusCode) {
            return TestResult.DEFENDED;
        }

        // 如果响应码一致，则判断响应体
        String originalBody = originalResponse.bodyToString();
        String testBody = testResponse.bodyToString();

        // 响应体一致，则显示"被绕过"
        if (Objects.equals(originalBody, testBody)) {
            return TestResult.BYPASSED;
        }

        // 响应体不一致，则显示"待确认被绕过"
        return TestResult.POTENTIALLY_BYPASSED;
    }

    /**
     * 更新测试结果到表格显示
     *
     * @param tableModel 表格模型
     * @param rowIndex 行索引
     * @param originalResponse 原始响应
     * @param testResponse 测试响应
     * @param resultColumnIndex 结果列索引
     * @param renderer 单元格渲染器
     * @param updateRenderers 更新渲染器的回调方法
     */
    public static void updateTestResult(DefaultTableModel tableModel,
                                        int rowIndex,
                                        HttpResponse originalResponse,
                                        HttpResponse testResponse,
                                        int resultColumnIndex,
                                        ColorTableCellRenderer renderer,
                                        Runnable updateRenderers) {
        if (originalResponse != null) {
            TestResult result = evaluateTestResult(originalResponse, testResponse);
            
            tableModel.setValueAt(result.getText(), rowIndex, resultColumnIndex);
            
            // 更新渲染器颜色
            if (renderer != null) {
                renderer.setBackgroundColor(result.getColor());
            }
            
            // 更新表格显示
            if (updateRenderers != null) {
                updateRenderers.run();
            }
        }
    }

    /**
     * 更新测试结果到表格显示（支持规则）
     *
     * @param tableModel 表格模型
     * @param rowIndex 行索引
     * @param originalResponse 原始响应
     * @param testResponse 测试响应
     * @param resultColumnIndex 结果列索引
     * @param renderer 单元格渲染器
     * @param updateRenderers 更新渲染器的回调方法
     * @param rules 规则列表
     * @param logicRelation 逻辑关系
     */
    public static void updateTestResultWithRules(DefaultTableModel tableModel,
                                                 int rowIndex,
                                                 HttpResponse originalResponse,
                                                 HttpResponse testResponse,
                                                 int resultColumnIndex,
                                                 ColorTableCellRenderer renderer,
                                                 Runnable updateRenderers,
                                                 List<RulePanel.Rule> rules,
                                                 String logicRelation) {
        if (originalResponse != null) {
            TestResult result = RuleUtil.evaluateTestResultWithRules(originalResponse, testResponse, rules, logicRelation);
            
            tableModel.setValueAt(result.getText(), rowIndex, resultColumnIndex);
            
            // 更新渲染器颜色
            if (renderer != null) {
                renderer.setBackgroundColor(result.getColor());
            }
            
            // 更新表格显示
            if (updateRenderers != null) {
                updateRenderers.run();
            }
        }
    }
}
